package file

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"os"
	"server/business/utils"

	"time"
)

type FilePart struct {
	Fid  string `json:"fid"`
	Idx  int    `json:"idx"`
	Data []byte `json:"data"`
	Md5  string `json:"md5"`
}

type FileMeta struct {
	Fid        string    `json:"fid"` // 文件标识
	Name       string    `json:"name"`
	Size       int64     `json:"size"`
	Md5        string    `json:"md5"`      // 分片后，用于验证文件完整性
	SliceNum   int       `json:"sliceNum"` // 切片数量 = 文件大小 / 切片大小，静态值
	ModifyTime time.Time `json:"modifyTime"`
}

func GetFileMeta(path string) (*FileMeta, error) {
	mFile, err := os.Open(path)
	defer mFile.Close()
	if err != nil {
		return nil, err

	}
	var bs []byte
	bs, err = io.ReadAll(mFile)
	if err != nil {
		return nil, err

	}
	fileMeta := &FileMeta{}
	err = json.Unmarshal(bs, fileMeta)
	if err != nil {
		return nil, err

	}
	return fileMeta, nil
}

func SetFileMeta(path string, fileMeta *FileMeta) error {
	bs, err := json.Marshal(fileMeta)
	if err != nil {
		return err
	}

	var mFile *os.File
	mFile, err = utils.CreateFile(path)
	if err != nil {
		return err
	}
	defer mFile.Close()

	_, err = io.Copy(mFile, bytes.NewReader(bs))
	return err
}

func NeedCreateFileMeta(path string, meta *FileMeta) bool {
	_, err := utils.FileExist(path)
	if err != nil {
		// 文件不存在
		return true
	}
	var file *os.File
	file, err = os.OpenFile(path, os.O_RDONLY, 0644)
	defer file.Close()
	if err != nil {
		fmt.Println(err)
		return true
	}
	var bs []byte
	bs, err = io.ReadAll(file)
	if err != nil {
		fmt.Println(err)
		return true
	}
	var info *FileMeta
	err = json.Unmarshal(bs, &info)
	if err != nil {
		fmt.Println(err)
		return true
	}
	if info.ModifyTime == meta.ModifyTime || info.Size == meta.Size {
		return false
	}
	return true

}
